# @Time : 2024/11/10 12:18
# @Author : Fioman 
# @Phone : 13149920693
"""
加法: __add__()
v1 = Vector(1,2)
v2 = Vector(3,4)
v3 = v1 + v2 = Vector(4,6)

绝对值: __abs__  针对向量就是求模
v1 = Vector(3,4)
abs(v1) = 5

标量积: __mul__
v1 = Vector(3,4)
v1 * 3 = Vector(9,12)

math.hypot(3,4) = 5
# 1. 计算向量的模
# 2. 计算一个点到原点的距离
"""

"""
关于bool(obj)方法:
默认情况下,用于自定义的类对象在调用bool()的时候,都会返回真.
除非是实现了__bool__方法或者是__len__方法,简单来说boo(obj)的调用顺序是这样的,
它会先去找obj.__bool__()方法,如果没有实现__bool__()方法,会尝试调用__len__()方法,
如果都没有实现,就返回True
"""
import math


class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        """
        !r 表示使用__repr__而不是__str__的方式来格式化字符串
        :return:
        """
        return f"Vector({self.x!r}, {self.y!r})"

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __mul__(self, scalar):
        return Vector(self.x * scalar, self.y * scalar)

    def __abs__(self):
        return math.hypot(self.x, self.y)

    def __bool__(self):
        return bool(abs(self))


if __name__ == '__main__':
    v1 = Vector(1, 2)
    v2 = Vector(3, 4)
    print("V1 = {}".format(v1))
    print("V2 = {}".format(v2))
    v3 = v1 + v2
    print("V3 = {}".format(v3))
    print("abs(v1) = {}".format(abs(v1)))
    print("abs(v2) = {}".format(abs(v2)))
    print("abs(v3) = {}".format(abs(v3)))

    v4 = v1 * 3
    print("V4 = {}".format(v4))

    print(bool(v1), bool(v2), bool(v3))
    print(bool(Vector(0, 0)))  # 只有这个向量才会返回False
